//
// Created by hsj on 2022/3/8.
//
#include "t_auto_ptr.h"
namespace t_auto_ptr_test{
    void test(){
        {
            //所有权、只有一个智能指针可以拥有它
            std::auto_ptr<Report> pr(new Report("using auto_ptr"));
            pr->comment();

//            std::auto_ptr<string> films[5] = {
//                    std::auto_ptr<string>(new string("auto one")),
//                    std::auto_ptr<string>(new string("auto two")),
//                    std::auto_ptr<string>(new string("auto three")),
//                    std::auto_ptr<string>(new string("auto four")),
//                    std::auto_ptr<string>(new string("auto five"))
//            };
//            std::auto_ptr<string> pr002 = films[2];
//
//            for (int i = 0; i < 5; ++i) {
//                //下标2时候程序异常终止
//                //unique_ptr方式则编译时候出错
//                cout<<*films[i]<<endl;
//            }
//            cout<<*pr002<<endl;
        }
        {
            //所有权、只有一个智能指针可以拥有它
            std::unique_ptr<Report> pr(new Report("using unique_ptr"));
            pr->comment();
        }







        {
            //引用计数方式
            std::shared_ptr<Report> pr(new Report("using shared_ptr"));
            pr->comment();

            std::shared_ptr<string> films[5] = {
                    std::shared_ptr<string>(new string("auto one")),
                    std::shared_ptr<string>(new string("auto two")),
                    std::shared_ptr<string>(new string("auto three")),
                    std::shared_ptr<string>(new string("auto four")),
                    std::shared_ptr<string>(new string("auto five"))
            };
            std::shared_ptr<string> pr002 = films[2];

            for (int i = 0; i < 5; ++i) {
                //下标2时候程序异常终止
                cout<<*films[i]<<endl;
            }
            cout<<*pr002<<endl;
        }
        {
            string vacation("I am wandered lonely as a cloud.");
            // No ，vacation非堆内存创建的对象很危险，test结束就销毁了。
            // 再执行delete时候出错。
            std::shared_ptr<string> pr(&vacation);
         }
    }
}